package Test.加密;

import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.interfaces.RSAPublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.util.Base64;
import javax.crypto.Cipher;
/**
 * @Author kirito
 * @Date 2023/12/20 14:19
 * @PackageName:Test.加密
 * @ClassName: Test01
 * @Description:
 * byte[] inputByte = Base64.decodeBase64(str.getBytes(StandardCharsets.UTF_8));
 * 该行代码将传入的加密后的字符串 str 进行Base64解码，并将结果保存在 inputByte 字节数组中。
 * Base64解码是将经过Base64编码的字符串转换为原始的字节数组。
 *
 * byte[] decoded = Base64.decodeBase64(privateKey);
 * 这行代码将传入的私钥字符串 privateKey 进行Base64解码，并将结果保存在 decoded 字节数组中。
 * 私钥需要使用Base64编码进行传输和存储。
 *
 * RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
 * 该行代码使用 KeyFactory 类从 decoded 字节数组中生成一个RSA私钥 priKey。PKCS8EncodedKeySpec 是用于编码PKCS#8格式的私钥规范。
 *
 * Cipher cipher = Cipher.getInstance("RSA");
 * 这行代码创建一个 Cipher 对象，并指定使用RSA算法来进行加密/解密操作。
 *
 * cipher.init(Cipher.DECRYPT_MODE, priKey);
 * 该行代码初始化 cipher 对象，使用私钥 priKey 进行解密操作。Cipher.DECRYPT_MODE 表示解密模式。
 *
 * return new String(cipher.doFinal(inputByte));
 * 最后一行代码对 inputByte 字节数组执行解密操作，并将解密结果转换为字符串进行返回。
 * @Version 1.0
 */
public class RSADemo {
    public static void main(String[] args) throws Exception {
        // 生成RSA密钥对
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();

        // 要加密的原始字符串
        String originalString = "Hello, RSA!";

        // 使用公钥进行加密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedBytes = cipher.doFinal(originalString.getBytes(StandardCharsets.UTF_8));
        String encryptedString = Base64.getEncoder().encodeToString(encryptedBytes);
        System.out.println("加密后的字符串: " + encryptedString);

        // 使用私钥进行解密
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedString));
        String decryptedString = new String(decryptedBytes, StandardCharsets.UTF_8);
        System.out.println("解密后的字符串: " + decryptedString);
    }
}